package com.xxxtea.entity;

import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.xxxtea.common.BaseEnum;
import com.xxxtea.config.converter.BaseEnumDeserializer;
import com.xxxtea.mpe.annotation.Constraint;
import com.xxxtea.mpe.handler.AttachmentListHandler;
import com.xxxtea.mpe.model.Attachment;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;

import java.util.Date;
import java.util.List;

/**
 * 任务阶段实体类
 *
 * 用于存储任务的不同阶段信息，包括：
 * - 阶段基本信息（状态、描述等）
 * - 阶段图片管理
 * - 阶段异常管理
 * - 任务关联
 *
 * 使用MyBatis-Plus注解进行数据库映射
 * 使用Swagger注解进行API文档生成
 *
 * @author badman
 * @since 1.0.0
 */
@Data
@ApiModel("任务阶段")
@TableName(autoResultMap = true)
public class TaskStage {

	/**
	 * 主键ID
	 * 使用自增策略
	 */
	@ApiModelProperty("主键")
	@TableId(value = "id", type = IdType.AUTO)
	private Integer id;

	/**
	 * 任务ID
	 * 关联Task表
	 */
	@ApiModelProperty("任务ID")
	@Constraint(referenceClass = Task.class)
	private Integer taskId;

	/**
	 * 阶段状态
	 * 1-已接单 2-正在前往 3-物品已取到 4-等待确认 5-完成
	 * 使用枚举类型管理
	 */
	@ApiModelProperty("阶段状态 1-已接单 2-正在前往 3-物品已取到 4-等待确认 5-完成")
	@JsonDeserialize(using = BaseEnumDeserializer.class)
	private Status status;

	/**
	 * 阶段图片
	 * 使用自定义处理器处理附件列表
	 */
	@ApiModelProperty("阶段图片")
	@TableField(typeHandler = AttachmentListHandler.class)
	private List<Attachment> images;

	/**
	 * 阶段描述
	 * 阶段的详细描述信息
	 */
	@ApiModelProperty("阶段描述")
	private String description;

	/**
	 * 是否异常
	 * 0-正常 1-异常
	 * 使用枚举类型管理
	 */
	@ApiModelProperty("是否异常 0-正常 1-异常")
	@JsonDeserialize(using = BaseEnumDeserializer.class)
	private IsAbnormal isAbnormal;

	/**
	 * 阶段创建时间
	 * 自动填充插入时间
	 */
	@ApiModelProperty("阶段创建时间")
	@TableField(fill = FieldFill.INSERT)
	private Date createTime;

	/**
	 * 任务名称
	 * 非数据库字段，用于显示任务名称
	 */
	@TableField(exist = false)
//	@ExtendQuery(referenceClass = Task.class, targetColumn = "name")
	private String taskName;

	/**
	 * 阶段状态枚举
	 * 定义任务阶段的各种状态
	 */
	@Getter
	@AllArgsConstructor
	public enum Status implements BaseEnum<Status> {
		/**
		 * 已接单状态
		 */
		Type1(1, "已接单"),
		/**
		 * 正在前往状态
		 */
		Type2(2, "正在前往"),
		/**
		 * 物品已取到状态
		 */
		Type3(3, "物品已取到"),
		/**
		 * 等待确认状态
		 */
		Type4(4, "等待确认"),
		/**
		 * 完成状态
		 */
		Type5(5, "完成"),
		;
		private final Integer value;
		private final String label;
	}

	/**
	 * 是否异常枚举
	 * 定义阶段异常状态
	 */
	@Getter
	@AllArgsConstructor
	public enum IsAbnormal implements BaseEnum<IsAbnormal> {
		/**
		 * 正常状态
		 */
		NO(0, "正常"),
		/**
		 * 异常状态
		 */
		YES(1, "异常"),
		;
		private final Integer value;
		private final String label;
	}
}